import cv2
import numpy as np

def sort_contours(cnts, method="left-to-right"):
    """
    根据坐标值信息对轮廓进行排序
    :param cnts: 排序前的轮廓
    :param method: 排序方式
        - left-to-right: 从左到右
        - right-to-left: 从右到左
        - top-to-bottom: 从上到下
        - bottom-to-top: 从下到上
    :return: 排序后的 轮廓 和 外接矩形
    """
    reverse = False  # 是否反向排序
    i = 0  # 索引值

    # 如果是 从右到左 或 从下到上 那么就是反向排序
    if method == "right-to-left" or method == "bottom-to-top":
        reverse = True

    # 如果是 从上到下 或 从下到上 那么索引为 1
    if method == "top-to-bottom" or method == "bottom-to-top":
        i = 1
    bounding_boxes = [cv2.boundingRect(c) for c in cnts]  # 使用外接矩形将每个轮廓包起来 x,y,h,w
    # 获得排序后的 轮廓 和 外接矩形
    bounding_list, bounding_boxes = zip(*sorted(zip(cnts, bounding_boxes), key=lambda b: b[1][i], reverse=reverse))
    return bounding_list, bounding_boxes


def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
    """
    根据给定的宽度或高度对图像进行缩放
    :param image: 原始图像
    :param width: 目标宽度
    :param height: 目标高度
    :param inter: 插值方法
    :return: 缩放处理后的图像
    """
    dim = None
    h, w = image.shape[:2]  # 图片的高度和宽度
    if width is None and height is None:  # 高度和宽度皆未指定，不作处理直接返回
        return image
    if width is None:  # 宽度未指定，
        r = height / float(h)  # 根据给出的高度计算缩放比
        dim = (int(w * r), height)  # 得到缩放后的宽度和高度
    else:  # 高度未指定
        r = width / float(w)  # 根据给出的宽度计算缩放比
        dim = (width, int(h * r))  # 得到缩放后的宽度和高度
    resized = cv2.resize(image, dim, interpolation=inter)  # 进行缩放
    return resized
